package com.example.shutdown_v1.dto;

import lombok.Data;

/**
 * 昆仑网关消息DTO
 * 上行主题格式: GwData/{商家code}
 * 下行主题格式: SrvData/{商家code}/#
 */
@Data
public class KunLunGatewayMessage {
    
    /**
     * 消息类型
     * - "state": 设备数据消息
     * - "scan_report": 扫描报告
     */
    private String pkt_type;
    
    /**
     * 网关地址
     */
    private String gw_addr;
    
    /**
     * 时间戳
     */
    private String time;
    
    /**
     * 毫秒
     */
    private String msec;
    
    /**
     * 数据载荷
     */
    private DataPayload data;
    
    /**
     * SIM卡ICCID（scan_report消息特有）
     */
    private String iccid;
    
    /**
     * 数据载荷内部类
     */
    @Data
    public static class DataPayload {
        /**
         * 消息ID
         */
        private Integer msgId;
        
        /**
         * 状态类型
         * - "sta_device_data": 设备数据
         */
        private String state;
        
        /**
         * 设备地址（传感器ID）
         */
        private String device_addr;
        
        /**
         * 接收信息
         */
        private RecvInfos recv_infos;
        
        /**
         * 扫描报告特有字段
         */
        private Integer flags;
        private Integer pkt_sn;
        private String report_type;
        private Integer pkt_total;
        private Integer pkt_index;
        private Integer dev_total;
        private Integer dev_num;
        private java.util.List<DeviceInfo> dev_infos;  // 设备列表
    }
    
    /**
     * 设备信息（scan_report中的dev_infos数组元素）
     */
    @Data
    public static class DeviceInfo {
        private String addr;        // 设备MAC地址
        private Integer rssi;       // 信号强度
        private String time;        // 扫描时间
        private String msec;        // 毫秒
        private String name;        // 设备名称
        private String adv_raw;     // 广播数据
        private String srp_raw;     // 扫描响应数据
    }
    
    /**
     * 接收信息内部类
     */
    @Data
    public static class RecvInfos {
        /**
         * 句柄
         */
        private Integer handle;
        
        /**
         * 原始数据（十六进制字符串）
         */
        private String raw;
    }
}
